<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
    /**
     * The current password being used by the factory.
     */
    protected static ?string $password;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        // 使用中文语言包生成数据（已在 config/app.php 中设置 faker_locale 为 zh_CN）
        // 使用 fake('zh_CN') 确保生成中文数据
        $faker = fake('zh_CN');
        
        return [
            // 用户名使用拼音风格（因为中文用户名可能有问题）
            'name' => $faker->userName() . '_' . $faker->randomNumber(4),
            'username' => null, // 由模型的 boot 方法自动生成
            'email' => $faker->unique()->safeEmail(),
            'phone' => $faker->optional()->regexify('1[3-9]\d{9}'),
            'email_verified_at' => now(),
            'password' => static::$password ??= Hash::make('password'),
            'remember_token' => Str::random(10),
            'avatar' => null,
            // 使用中文生成昵称、签名和简介
            // Faker zh_CN 可以生成中文姓名，但 sentence 和 paragraph 不支持中文
            // 所以使用中文模板数组
            'nickname' => $faker->optional(0.8)->name(), // 80% 概率生成中文昵称（如：张三、李四）
            'signature' => $faker->optional(0.6)->randomElement([
                '爱生活，爱分享',
                '记录生活中的美好瞬间',
                '努力成为更好的自己',
                '做自己喜欢的事',
                '简单快乐每一天',
                '用心感受生活的美好',
                '保持热爱，奔赴山海',
                null,
            ]), // 60% 概率生成中文签名
            'bio' => $faker->optional(0.5)->randomElement([
                '喜欢阅读、旅行和摄影，分享生活中的点点滴滴。',
                '热爱生活，享受每一个美好的瞬间。',
                '努力工作，认真生活，做一个有趣的人。',
                '追求梦想，永不言弃。',
                '记录成长路上的每一个脚印。',
                null,
            ]), // 50% 概率生成中文简介
            'exp' => fake()->numberBetween(0, 1000),
            'is_admin' => false,
        ];
    }

    /**
     * Indicate that the model's email address should be unverified.
     */
    public function unverified(): static
    {
        return $this->state(fn (array $attributes) => [
            'email_verified_at' => null,
        ]);
    }

    /**
     * Indicate that the user is an admin.
     */
    public function admin(): static
    {
        return $this->state(fn (array $attributes) => [
            'is_admin' => true,
        ]);
    }

    /**
     * Set user with phone number.
     */
    public function withPhone(string $phone = null): static
    {
        return $this->state(fn (array $attributes) => [
            'phone' => $phone ?? fake('zh_CN')->regexify('1[3-9]\d{9}'),
        ]);
    }

    /**
     * Set user with high experience.
     */
    public function experienced(int $exp = null): static
    {
        return $this->state(fn (array $attributes) => [
            'exp' => $exp ?? fake()->numberBetween(500, 2000),
        ]);
    }
}
